
from flask import Blueprint,request,jsonify,redirect
import requests
from werkzeug import datastructures
from utils.db import db
from utils.comm import get_data

import datetime
import random

bp_weibo = Blueprint('weibo',__name__)






@bp_weibo.route('/weiboCallback/')
def weiboCallback():
    code = request.args.get('code')
    #微博认证地址
    access_token_url = "https://api.weibo.com/oauth2/access_token"
    #参数
    response = requests.post(access_token_url,data={
        "client_id": '3648830690',
        "client_secret": "916d80b477ccffce5d70e63b02bb1092",
        "grant_type": "authorization_code",
        "code": code,
        "redirect_uri": "http://127.0.0.1:8000/users/weiboCallback/",
    })
    #因为用的requests  需要文本展示  eval可以转换任何字符串格式
    res = eval(str(response.text))
    # print(res)
    # print(res['uid'])
    #认证结束后 获取微博给的token 和uid
    
    try:
        uid = res['uid']
        token = res['access_token']
        
    except:
    #如果没有uid 跳转一个页面 类似 网页跑丢了
        uid = 0
        return redirect('http://localhost:8888/error')
    #有了uid 可以查看大用户在sf_login身份表中有无信息用到链表查询名字 有就登录 没有要绑定 相当于注册
    sql = "select u.id,u.nikename from sf_login as sf inner join users as u on sf.user_id=u.id where uid=%d"%int(uid)
    ress = db.find_one(sql)
    #如果有信息就直接拿token登录 没有要代表没注册过需要绑定注册一个信息 type=1代表已经授权过了
    if ress:
        return redirect("http://localhost:8888/bindmobile/?type=1"+'&id='+str(ress['id'])+'$name='+ress['nikename'])
    else:
        #type = 2代表授权了但是用户不在sf——login身份表中 需要注册 这个时候需要uid，token，webfrom（那个网站这边是新浪）
        return redirect("http://localhost:8888/bindmobile/?type=1"+'&uid='+str(uid)+'$token='+token)


@bp_weibo.route('/bindMobile/',methods=['POST','GET'])
def bindMobile():
    if request.method == 'POST':
        #绑定uid  token mobile
        data = get_data()
        #根据手机号查看邮箱是否绑定
        sql = "select id from sf_login where email='%s'"%data['mobile']
        res = db.find_one()
        if res:
            return jsonify({"code":10010,'mas':'邮箱已存在,不能再次绑定'})
        else:
            #现在用户表里注册信息
            sql = "insert into users(`email`) values('%s')"%data['mobile']
            db.insert(sql)
            #查询新注册的email 的id 构造身份表
            sql1 = "select id form users wherer email='%s'"%(data['meobile'])
            user = db.find_one(sql1)
            #添加到三方表里
            sql2= "insert into sf_login(`user_id`,`platfrom`,`uid`,`token`) values(%d,'weibo',%d,'%s')"%(int(user['id']),int(data['uid']),data['token'])
            db.insert(sql2)
            return jsonify({'code':200,'id':user['id'],'name':data['mobile']})

    else:
        pass


#训练营
@bp_weibo.route('/active/',methods=['POST','GET'])
def aactive():
    if request.method == "POST":
        data = get_data()
        #先看用户有没有参加过活动 在用户记录表查看
        sql  = "select * from actrecord where mobile='%s' and active_id=%d"%(data['mobile'],int(data['active_id']))
        res = db.find_one(sql)
        
        if res:
            return jsonify({"code":200,'mas':'您已经参加过该次活动'})
        #没参加过 在用户表查看有没有该用户 没用户就是没权限参加有 就按等级收费
        sql1 = "select * from users where nikename='%s'"%(data['mobile'])
        res1 = db.find_one(sql1)


        #活动信息
        sql2 = "select * from active where id=%d"%int(data['active_id'])
        res2 = db.find_one(sql2)
        if res1:
            #有用户  根据等级判断什么用户 最后收费还是不收费
            if res1['level'] == 3:  #vvip用户
                sql = "insert into actrecord(`mobile`,`active_id`,`type`,`spayment`,`price`) values('%s',%d,1,1,%d)"%(data['mobile'],int(data['active_id']),float(data['price']))
                
                db.insert(sql)
                
                #活动人数减一
                if res2['rpeople']>=1:
                    count  = int(res2['rpeople']) -1
                    #修改数据
                    sql = "update active set rpeople=%d where id=%d"%(count,int(data['active_id']))
                    db.update(sql)
                return jsonify({"code":200})

            else:
                #有信息 但是等级不是level=3 无权参加
                return jsonify({"code":10011,'mes':'您无权参与此活动'})
        else:
            #没有用户 说明新用户 生成订单交钱参加
            #先添加新用户
            sql = "insert into actrecord(`mobile`,`active_id`,`type`,`spayment`,`price`) values('%s',%d,2,0,%d)"%(data['mobile'],int(data['active_id']),float(data['price']))
            db.insert(sql)
            #查询新用户加进去没 前端跳支付页面 这边查询返回价格和订单的id 后期修改订单状态用
            sql2  = "select * from actrecord where mobile='%s' and active_id=%d"%(data['mobile'],int(data['active_id']))
            res2 = db.find_one(sql2)

            return jsonify({"code":200,'order_id':res2['id'],'money':res2['price']})
            
        

    else:
        sql = "select id,title,price from active"
        res = db.find_all(sql)
        return jsonify({'code':200,'list':res})


#测试支付宝

from utils.comm import  get_ali_object
@bp_weibo.route('/pay/')
def pay():

        #获取数据
        order_id = request.args.get('id')
        #查询价格和
        sql = "select * from actrecord where id=%d" %(int(order_id))

        res = db.find_one(sql)

        alipay = get_ali_object()
        # 生成支付的url
        query_params = alipay.direct_pay(
            subject="test",  # 商品简单描述
            out_trade_no='xly:'+str(order_id),  # 用户购买的商品订单号（每次不一样） 20180301073422891 +str(datetime.datetime.now().strftime("%Y%M%D")),
            total_amount=int(res['price']),  # 交易金额(单位: 元 保留俩位小数)
        )
        #返回流水号  不跳转 需要前端跳转  吧地址传入到前端
        pay_url = "https://openapi.alipaydev.com/gateway.do?{0}".format(query_params)  # 支付宝网关地址（沙箱应用）
        return jsonify({'code':200,'pay_url':pay_url})

#支付宝回单页面
@bp_weibo.route('/notify/')
def alipay_callback():
    # GET /users/notify/?charset=utf-8&out_trade_no=43&method=alipay.trade.page.pay.return&total_amount=150.00&sign=AMqTGUVbzkKTWtF2BqjHze0yfFGZwTq%2FynZbBvbfiIVRI4h0GyyiqgT8o%2B2vrBE9PjxF9V%2FiOsGOOW4769Wo8LpbiUTZrdrtz8rLAP8jX7XwLUJVfQnzyKBhXcihRh8w%2F7FqzQOZg7O5wJxyOzOVr8EwydXkmhg0daurr7POQ%2BBQ858OtBYjsR%2Ba%2BBGHyaO%2FvEIlO4RKuB4rRAJXgfLwPT3%2FC72pg5uF82M5w0eIi2gHjDAK40jQUr%2BiW0tfT%2Fl2k9yxvEeJN%2B34jJoZ%2FkHiwgOSEfWHIkkkm7hns6U8%2FQ4u3d%2BtX%2F1AM1220xr%2FSv5GglKUVSGpjpPRfMFU0WaxrQ%3D%3D&trade_no=2021120622001461690501997585&auth_app_id=2021000118630129&version=1.0&app_id=2021000118630129&sign_type=RSA2&seller_id=2088621956632039&timestamp=2021-12-06+15%3A34%3A31 HTTP/1.1"
    #支付的时候传递给支付宝的订单号
    out_trade_no = request.args.get('out_trade_no')
    #支付宝的流水号
    trade_no = request.args.get('trade_no')
    
    #这边分割是为了多个支付用一个回调借口  vip:4564 , xly:4654
    orderlist = out_trade_no.split(':')

    if orderlist[0] == 'xly':
        xly(out_trade_no,trade_no)    
    elif orderlist[0] == 'vip':
        vip(out_trade_no,trade_no)
    return jsonify({'code':200})

#训练营回调
def xly(out_trade_no,trade_no):
    # 根据订单号查询是否支付
    orderlist = out_trade_no.split(':')
    sql = "select * from actrecord where id=%d"%int(orderlist[1])
    res = db.find_one(sql)
    print(res)
    #根据订单号查到了订单
    if res:
        #未支付变支付
        sql2 = "update actrecord set spayment=2,snumber='%s' where id=%d"%(str(trade_no),int(orderlist[1]))
        db.update(sql2)
        #查询活动次数并减一
        sql1 = "select * from active where id=%d"%(int(res['active_id']))
        res1 = db.find_one(sql1)
        if int(res1['rpeople'])>=1:
                count = int(res1['rpeople'])-1
                sql2 = "update active set rpeople=%d where id=%d"%(count,int(res['active_id']))
                db.update(sql2)
                return redirect('http://localhost:8888')
        
#用户升级vip
def vip(out_trade_no,trade_no):
    # 根据订单号查询是否支付
    orderlist = out_trade_no.split(':')
    sql = "select * from vip_order where order_on='%s'"%out_trade_no
    res = db.find_one(sql)

    #根据订单号有没有订单
    #有订单 代表用户要升级
    if res:
        sql1 = "select * from users where id=%d"%res['user_id']
        user = db.find_one(sql1)
        sql11 = "select * from vip where id=%d"%int(res['vip_id'])
        res11 = db.find_one(sql11)
        #用户等级等于升级等级 加时间
        if int(user['level']) == int(res11['type']):
            pass
            #查询vip各等级时间
            sql8 = "select * from vip where type = %d"%int(res['vip_id'])
            res8 = db.find_one(sql8)
            #查询 用户本来1级有点击1级 就是续费时间
            sql2= "select * from vip_order_record where user_id=%d"%(int(user['id']))
            res2 = db.find_one(sql2)
            #获取用户原来时间
            stime = res2['etime']
            etime = stime+datetime.timedelta(days=int(res8['day']))
            #修改用户续费时间
            sql9 = "update vip_order_record set etime='%s'"%(etime)
            db.update(sql9)
            return jsonify({'code':200})
        #不等于 升级vip
        else:
            #有订单 修改 支付状态  回单号
            sql3 = "update vip_order set pay_status=%d,transaction='%s' where order_on='%s'"%(2,trade_no,out_trade_no)
            db.update(sql3)
            #修改用户表中用户的vip等级情况
            count = int(res['vip_id'])
            sql4 = "update users set level=%d where id=%d"%(count,res['user_id'])
            db.update(sql4)
            
            #判断需要加几天
            sql5 = 'select * from vip'
            res5 = db.find_one(sql5)
            if int(res5['type']) == 1:
                #记录该用户vip有效时间 30天
                stime = datetime.datetime.now()
                etime = stime+datetime.timedelta(days=int(res5['day']))
                sql2 = "insert into vip_order_record(stime,etime,type,user_id) values('%s','%s',%d,%d)"%(stime,etime,int(res['vip_id'],int(res['user_id'])))
                db.insert(sql2)
                return jsonify({'code':200})
            elif int(res5['type']) == 2:
                #记录该用户vip有效时间 365天
                stime = datetime.datetime.now()
                etime = stime+datetime.timedelta(days=int(res5['day']))
                sql6 = "insert into vip_order_record(stime,etime,type,user_id) values('%s','%s',%d,%d)"%(stime,etime,int(res['vip_id']),int(res['user_id']))
                db.insert(sql6)
                return jsonify({'code':200})
            else:
                #记录该用户vip有效时间  无限期
                stime = datetime.datetime.now()
                etime = stime+datetime.timedelta(days=99999)
                sql7 = "insert into vip_order_record(stime,etime,type,user_id) values('%s','%s',%d,%d)"%(stime,etime,int(res['vip_id']),int(res['user_id']))
                db.insert(sql7)
                return jsonify({'code':200})







#展示vip价格接口
@bp_weibo.route('/upvip/',methods=['POST',"GET"])
def upvip():
    if request.method == "POST":
        pass
    else:
        sql = "select * from vip order by type asc"
        res=db.find_all(sql)
        return jsonify({'code':200,'list':res})

#升级vip接口
@bp_weibo.route('/upgradevip/',methods=['POST',"GET"])
def upgradevip():
    if request.method == "POST":
        pass
    else:
        #接收那个用户升级vip  用户是什么vip
        id = request.args.get('id')
        userid= request.args.get('userid')
        print(id,userid)

        #没有id userid 说明没有用户升级
        if not all([id,userid]):
            return jsonify({"code":200,'mas':'参数错误'})
        #如果有要升级的用户 查询用户现在vip的金额 生成订单
        sql = "select * from vip where id=%d"%(int(id))
        res = db.find_one(sql)
        #-------------生成订单 
        order_on = "vip:"+str(datetime.datetime.now().strftime("%Y%m%d"))+str(userid)+str(random.randint(10000,99999))
        sql1 = "insert into vip_order(`user_id`,`order_on`,`money`,`pay_status`,`vip_id`) values(%d,'%s',%f,1,%d)"%(int(userid),order_on,float(res['money']),int(id))
        db.insert(sql1)
        # 用支付宝支付
        alipay = get_ali_object()
        # 生成支付的url
        query_params = alipay.direct_pay(
            subject="test",  # 商品简单描述
            out_trade_no=order_on,  # 用户购买的商品订单号（每次不一样） 20180301073422891 +str(datetime.datetime.now().strftime("%Y%M%D")),
            total_amount=int(res['money']),  # 交易金额(单位: 元 保留俩位小数)
        )
        #返回流水号  不跳转 需要前端跳转  吧地址传入到前端
        pay_url = "https://openapi.alipaydev.com/gateway.do?{0}".format(query_params)  # 支付宝网关地址（沙箱应用）
        return jsonify({'code':200,'pay_url':pay_url})

        #回调支付宝 在vip_record里写入数据
